/*
 * Copyright 2011-2020 GatlingCorp (https://gatling.io)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package io.gatling.http.action.sse

import io.gatling.commons.util.TypeCaster
import io.gatling.commons.validation._
import io.gatling.core.session.Session
import io.gatling.http.action.sse.fsm.SseFsm

object SseAction {
  implicit val SseFsmTypeCaster: TypeCaster[SseFsm] = new TypeCaster[SseFsm] {
    @throws[ClassCastException]
    override def cast(value: Any): SseFsm =
      value match {
        case v: SseFsm => v
        case _         => throw new ClassCastException(cceMessage(value, classOf[SseFsm]))
      }

    override def validate(value: Any): Validation[SseFsm] =
      value match {
        case v: SseFsm => v.success
        case _         => cceMessage(value, classOf[SseFsm]).failure
      }
  }
}

trait SseAction {

  // import optimized TypeCaster
  import SseAction._

  final def fetchFsm(actorName: String, session: Session): Validation[SseFsm] =
    session(actorName)
      .validate[SseFsm]
      .mapError(m => s"Couldn't fetch open sse: $m")
}
